A general catch
block seems like an efficient way to handle multiple possible exceptions. Unfortunately, it traps all exception types,
casting too broad a net, and perhaps mishandling extraordinary cases. Instead, specific exception sub-types should be caught.
Noncompliant code example
try {
file.open("test.txt");
} catch (...) { // Noncompliant
// ...
}
Compliant solution
try {
file.open("test.txt");
} catch (std::ifstream::failure e) {
// ...
}
Exceptions
There are cases though where you want to catch all exceptions, because no exceptions should be allowed to escape the function, and generic
catch
handlers are excluded from the rule:
- In the main function
- In a class destructor
- In a
noexcept
function
- In an
extern "C"
function
Additionally, if the catch
handler is throwing an exception (either the same as before, with throw;
or a new one that may
make more sense to the callers of the function), or is never exiting (because it calls a noreturn
function, for instance
exit
), then the accurate type of the exception usually does not matter any longer: this case is excluded too.